From: Boris Ostrovsky Date: Tue, 24 Mar 2015 08:27:00 +0000 (+0100) Subject: x86: don't use BAD_APICID for non-APICID fields X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3536 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=6f20b0edf42efb3aabd954398d995d801a653677;p=xen.git x86: don't use BAD_APICID for non-APICID fields BAD_APICID is used by cpuinfo_x86's phys_proc_id, cpu_core_id and compute_unit_id even though these fields don't hold an APIC ID itself but rather its derivative. Provide appropriate macros for each of those three (and make them unsigned). This also fixes regression introduced by commit 2090f14c5cbd ("sysctl: make XEN_SYSCTL_topologyinfo sysctl a little more efficient") which leaked BAD_APICID into common code, breaking ARM. Reported-by: Julien Grall Signed-off-by: Boris Ostrovsky Ditch INVALID_{CORE,SOCKET}ID in favor of always using XEN_INVALID_{CORE,SOCKET}_ID. Signed-off-by: Jan Beulich --- diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 5c8d3c251e..53dbd84181 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -12,6 +12,7 @@ #include #include #include +#include /* for XEN_INVALID_{SOCKET,CORE}_ID */ #include "cpu.h" @@ -277,9 +278,9 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) c->x86_max_cores = 1; c->x86_num_siblings = 1; c->x86_clflush_size = 0; - c->phys_proc_id = BAD_APICID; - c->cpu_core_id = BAD_APICID; - c->compute_unit_id = BAD_APICID; + c->phys_proc_id = XEN_INVALID_SOCKET_ID; + c->cpu_core_id = XEN_INVALID_CORE_ID; + c->compute_unit_id = INVALID_CUID; memset(&c->x86_capability, 0, sizeof c->x86_capability); generic_identify(c); diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 314e2535a8..d3fe116cd6 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -792,9 +792,9 @@ remove_siblinginfo(int cpu) cpumask_clear_cpu(cpu, per_cpu(cpu_sibling_mask, sibling)); cpumask_clear(per_cpu(cpu_sibling_mask, cpu)); cpumask_clear(per_cpu(cpu_core_mask, cpu)); - c[cpu].phys_proc_id = BAD_APICID; - c[cpu].cpu_core_id = BAD_APICID; - c[cpu].compute_unit_id = BAD_APICID; + c[cpu].phys_proc_id = XEN_INVALID_SOCKET_ID; + c[cpu].cpu_core_id = XEN_INVALID_CORE_ID; + c[cpu].compute_unit_id = INVALID_CUID; cpumask_clear_cpu(cpu, &cpu_sibling_setup_map); } diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index be6859a6b7..90f85a2598 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -1952,7 +1952,7 @@ static void deactivate_runqueue(struct csched2_private *prv, int rqi) static void init_pcpu(const struct scheduler *ops, int cpu) { - int rqi; + unsigned rqi; unsigned long flags; struct csched2_private *prv = CSCHED2_PRIV(ops); struct csched2_runqueue_data *rqd; @@ -1977,7 +1977,7 @@ static void init_pcpu(const struct scheduler *ops, int cpu) else rqi = cpu_to_socket(cpu); - if ( rqi < 0 ) + if ( rqi == XEN_INVALID_SOCKET_ID ) { printk("%s: cpu_to_socket(%d) returned %d!\n", __func__, cpu, rqi); @@ -2020,7 +2020,7 @@ csched2_alloc_pdata(const struct scheduler *ops, int cpu) { /* Check to see if the cpu is online yet */ /* Note: cpu 0 doesn't get a STARTING callback */ - if ( cpu == 0 || cpu_to_socket(cpu) >= 0 ) + if ( cpu == 0 || cpu_to_socket(cpu) != XEN_INVALID_SOCKET_ID ) init_pcpu(ops, cpu); else printk("%s: cpu %d not online yet, deferring initializatgion\n", diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index fc7b3d59b0..a8c629f38d 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -346,11 +346,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) if ( cpu_present(i) ) { cputopo.core = cpu_to_core(i); - if ( cputopo.core == BAD_APICID ) - cputopo.core = XEN_INVALID_CORE_ID; cputopo.socket = cpu_to_socket(i); - if ( cputopo.socket == BAD_APICID ) - cputopo.socket = XEN_INVALID_SOCKET_ID; cputopo.node = cpu_to_node(i); if ( cputopo.node == NUMA_NO_NODE ) cputopo.node = XEN_INVALID_NODE_ID; diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index 87d80ffe69..a9b4e06cf4 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -180,9 +180,9 @@ struct cpuinfo_x86 { __u32 booted_cores; /* number of cores as seen by OS */ __u32 x86_num_siblings; /* cpuid logical cpus per chip value */ __u32 apicid; - int phys_proc_id; /* package ID of each logical CPU */ - int cpu_core_id; /* core ID of each logical CPU*/ - int compute_unit_id; /* AMD compute unit ID of each logical CPU */ + __u32 phys_proc_id; /* package ID of each logical CPU */ + __u32 cpu_core_id; /* core ID of each logical CPU*/ + __u32 compute_unit_id; /* AMD compute unit ID of each logical CPU */ unsigned short x86_clflush_size; } __cacheline_aligned; diff --git a/xen/include/asm-x86/smp.h b/xen/include/asm-x86/smp.h index 81f861005e..67518cf30b 100644 --- a/xen/include/asm-x86/smp.h +++ b/xen/include/asm-x86/smp.h @@ -16,7 +16,8 @@ #include #endif -#define BAD_APICID -1U +#define BAD_APICID (-1U) +#define INVALID_CUID (~0U) /* AMD Compute Unit ID */ #ifndef __ASSEMBLY__ /*